const { sqlite, database } = require("../JDBC")
const pvf = require("./pvf.js");
const Path = require('path')
const { Task } = require("../Task");
const windows = global.windows;

const NoEditError = new Error(`肥肠抱歉,暂不支持PvfEdit`);
const NoUtilityError = new Error(`肥肠抱歉,暂不支持PvfUtility`);
const UnConfigError = new Error(`肥肠抱歉,请先配置pvf选项`);
const NoParamError = new Error("参数不能为空!")

/**
 * PvfConnect
 * init.js 导入到html
 * 
 * init.js 对外提供统一的接口名称，内部根据类型调用API
 *         根据实际需求对api再封装，以扩展功能
 * 
 * pvf.js  对连接工具api封装
 */


//获取数据库配置的pvf工具信息
// {"name":"0","ip:localhost",port":"27000","version":""}
// name: 0:pvfUtility 1:pvfedit
function getPvfConfig() {
    return sqlite.config.queryByName("pvfTool")
}

//pvfutility搜索类型枚举
// const SEARCH_TYPE = Object.freeze({
//     "NAME": 3,          //name字段
//     "NUMBER": 0,        //数值搜索
//     "STRING": 1,        //字符串搜索
//     "CONTENT": 4,       //文件内容搜索
//     "FILE_NAME": 2      //文件名搜索
// });

// class SearchPvfParam {
//     constructor() {
//         this.keyword = null;                //string 关键字
//         this.searchFolder = null;           //string 搜索文件夹  `equipment/character`
//         this.fileTypesString = null;        //string 文件后缀名  与RemoveOrKeep关联
//         this.removeOrKeep = null;           //number 后缀名保留或排除  0排除 1保留
//         this.type = null;                   //number 搜索类型  0整数浮点 1字符串 2文件名 3名称([name]字段) 4文件内容
//         this.sourceType = null;             //number 搜索范围  0所有文件 1从搜索结果匹配 2从搜索结果排除
//         this.useRegularExpression = null;   //boolean 是否使用正则
//         this.wholeWordMatch = null;         //boolean 是否全词匹配
//         this.normalUsing = null;            //number 未知 默认1
//         this.isStartMatch = null;           //boolean 是否从首字母开始匹配关键词
//         this.searchResult = null;           //string[] 搜索结果,当sourceType=1,2时有效
//         this.isUseLikeSearchPath = null;    //boolean 是否使用文件夹路径模糊匹配
//         this.scriptContentSearchMode = null;//number 未知 默认1
//         this.trait = null;                  //boolean 是否使用特征搜索 type=4时有效
//         this.scriptContent = null;          //string 脚本内容  当type=4&trait=false时有效
//         this.scriptContentStart = null;     //string 特征搜索开始字符串 当type=4&trait=true时有效 与ScriptContentStart搭配使用
//         this.scriptContentStop = null;      //string 特征搜索结束字符串 同上
//     }
// }

//封装接口
const Pvf = {


    // 查询工具版本，并将结果写入数据库
    // 只有pvfutility高版本提供此功能
    // api只封装有用的基础功能，高版本api没有使用，查询版本功能使用意义不大
    // getVersion() {
    //     return new Promise((res, rej) => {

    //         //获取pvf配置
    //         getPvfConfig().then(result => {
    //             if (!result || !result.value) {
    //                 return rej(UnConfigError);
    //             }
    //             const config = JSON.parse(result.value);

    //             if (config.name == "0") {
    //                 pvf.pvfUtility.GetVersion().then(data => {
    //                     if (!data || data == "") {
    //                         updateVersion(""); //获取失败 设为空
    //                     }

    //                     data = JSON.parse(data);
    //                     if (data.Data && data.Data != "") {
    //                         updateVersion(data.Data);
    //                     } else {
    //                         updateVersion("");//获取失败 设为空
    //                     }
    //                 }).catch(e => {
    //                     updateVersion("");//获取失败 设为空
    //                 })
    //             } else {
    //                 return rej(NoEditError);
    //             }

    //             const updateVersion = (version) => {
    //                 config.version = version
    //                 sqlite.config.update("pvf", JSON.stringify(config)).then(data => {
    //                     res(version);
    //                 })
    //             }
    //         }).catch(e => {
    //             rej(e)
    //         })
    //     })
    // },
    /** */

    //获取所有lst文件列表
    getLstFiles() {
        return new Promise((res, rej) => {

            getPvfConfig().then(result => {
                if (!result || !result.value) {
                    return rej(UnConfigError);
                }
                const config = JSON.parse(result.value);

                if (config.name == "0") {
                    pvf.pvfUtility.GetAllLstFileList(config.ip, config.port).then(data => {
                        res(data);
                    }).catch(err => {
                        rej(err);
                    })
                } else {
                    //@TODO 获取全部文件然后过滤
                    rej(NoEditError);
                }
            })
        });
    },

    //获取文件内容
    //@param filePaths:Array<string>  文件路径
    getFiles(filePaths) {
        return new Promise((res, rej) => {

            if (!filePaths || !filePaths.length) {
                return rej(NoParamError)
            }

            getPvfConfig().then(result => {
                if (!result || !result.value) {
                    return rej(UnConfigError);
                }
                const config = JSON.parse(result.value);

                const task = new Task(filePaths.length, (result) => {
                    res(result);
                })

                filePaths.forEach(path => {
                    if (config.name == "0") {
                        pvf.pvfUtility.GetFileContent(config.ip, config.port, path).then(data => {
                            task.push(data);
                        }).catch(err => {
                            rej(err)
                        })
                    } else {
                        //@TODO
                        return rej(NoEditError);
                    }
                });
            }).catch(e => {
                rej(e);
            })
        })
    },

    //获取文件夹下的所有文件
    //@param filePaths:string  文件夹路径
    getDirFiles(filePaths) {
        return new Promise((res, rej) => {

            if (!filePaths && filePaths == "") {
                return rej(NoParamError)
            }

            getPvfConfig().then(result => {
                if (!result || !result.value) {
                    return rej(UnConfigError);
                }
                const config = JSON.parse(result.value);
                if (config.name == "0") {
                    pvf.pvfUtility.GetFileList(config.ip, config.port, filePaths).then(data => {
                        res(data)
                    }).catch(err => {
                        rej(err)
                    })
                } else {
                    //@TODO
                    rej(NoEditError);
                }
            }).catch(e => {
                rej(e);
            })
        })
    },

    //新增或更新文件
    //@param params:Array<> 
    /*
        [{
            filePath:string,
            fileText:string
        }]
    */
    insertFiles(params) {
        return new Promise((res, rej) => {

            if (!params || !params.length) {
                return rej(NoParamError)
            }

            getPvfConfig().then(result => {
                if (!result || !result.value) {
                    return rej(UnConfigError);
                }
                const config = JSON.parse(result.value);

                const task = new Task(params.length, (result) => {
                    res(result);
                })

                params.forEach(param => {
                    if (config.name == "0") {
                        pvf.pvfUtility.ImportFile(config.ip, config.port, param.filePath, param.fileText).then(data => {
                            task.push(data);
                        }).catch(err => {
                            rej(err)
                        })
                    } else {
                        //@TODO
                        return rej(NoEditError);
                    }
                });
            }).catch(e => {
                rej(e);
            })
        })
    },

    //删除文件
    //@param filePaths:Array<string>  文件路径
    deleteFiles(filePaths) {
        return new Promise((res, rej) => {

            if (!filePaths || !filePaths.length) {
                return rej(NoParamError)
            }

            getPvfConfig().then(result => {
                if (!result || !result.value) {
                    return rej(UnConfigError);
                }
                const config = JSON.parse(result.value);

                if (config.name == "0") {
                    pvf.pvfUtility.DeleteFiles(config.ip, config.port, filePaths).then(data => {
                        res(data)
                    }).catch(err => {
                        rej(err)
                    })
                } else {
                    //@TODO
                    rej(NoEditError);
                }
            }).catch(e => {
                rej(e);
            })
        })
    },

    //获取文件name和code
    //@param filePaths:Array<string>  文件路径
    getFileNameAndCode(filePaths) {
        return new Promise((res, rej) => {

            if (!filePaths || !filePaths.length) {
                return rej(NoParamError)
            }

            getPvfConfig().then(result => {
                if (!result || !result.value) {
                    return rej(UnConfigError);
                }
                const config = JSON.parse(result.value);

                if (config.name == "0") {
                    pvf.pvfUtility.GetItemInfos(config.ip, config.port, filePaths).then(data => {
                        res(data)
                    }).catch(err => {
                        rej(err)
                    })
                } else {
                    //@TODO
                    rej(NoEditError);
                }
            }).catch(e => {
                rej(e);
            })
        })
    },

    //获取左侧选中文件合集
    getFileSelected() {
        return new Promise((res, rej) => {

            getPvfConfig().then(result => {
                if (!result || !result.value) {
                    return rej(UnConfigError);
                }
                const config = JSON.parse(result.value);

                if (config.name == "0") {
                    pvf.pvfUtility.GetTreeSelectedFiles(config.ip, config.port).then(data => {
                        res(data)
                    }).catch(err => {
                        rej(err)
                    })
                } else {
                    //@TODO
                    rej(NoEditError);
                }
            }).catch(e => {
                rej(e);
            })
        });
    },

    //获取右侧搜索选中文件合集
    getSeachSelected() {
        return new Promise((res, rej) => {

            getPvfConfig().then(result => {
                if (!result || !result.value) {
                    return rej(UnConfigError);
                }
                const config = JSON.parse(result.value);

                if (config.name == "0") {
                    pvf.pvfUtility.GetSearchPanelSelectedFiles(config.ip, config.port).then(data => {
                        res(data)
                    }).catch(err => {
                        rej(err)
                    })
                } else {
                    //@TODO
                    rej(NoEditError);
                }
            }).catch(e => {
                rej(e);
            })
        });
    },

    //获取当前编辑文件
    getFileActive() {
        return new Promise((res, rej) => {

            getPvfConfig().then(result => {
                if (!result || !result.value) {
                    return rej(UnConfigError);
                }
                const config = JSON.parse(result.value);

                if (config.name == "0") {
                    pvf.pvfUtility.GetActiveDocumentFilePath(config.ip, config.port).then(data => {
                        res(data)
                    }).catch(err => {
                        rej(err)
                    })
                } else {
                    //@TODO
                    rej(NoEditError);
                }
            }).catch(e => {
                rej(e);
            })
        });
    },

    //获取封包路径
    getPvfPath() {
        return new Promise((res, rej) => {

            getPvfConfig().then(result => {
                if (!result || !result.value) {
                    return rej(UnConfigError);
                }
                const config = JSON.parse(result.value);

                if (config.name == "0") {
                    pvf.pvfUtility.GetPvfPackFilePath(config.ip, config.port).then(data => {
                        res(data)
                    }).catch(err => {
                        rej(err)
                    })

                } else {
                    //@TODO
                    rej(NoEditError);
                }
            }).catch(e => {
                rej(e);
            })
        });
    },

    //封包另存为
    //@param path:string 系统文件绝对路径
    savePvfAsPath(path) {
        return new Promise((res, rej) => {
            if (!path || path == "") {
                return rej(NoParamError);
            }

            getPvfConfig().then(result => {
                if (!result || !result.value) {
                    return rej(UnConfigError);
                }
                const config = JSON.parse(result.value);

                if (config.name == "0") {
                    pvf.pvfUtility.SaveAsPvfFile(config.ip, config.port, path).then(data => {
                        res(data)
                    }).catch(err => {
                        rej(err)
                    })

                } else {
                    //@TODO
                    rej(NoEditError);
                }
            }).catch(e => {
                rej(e);
            })
        });
    },

    //pvf搜索  需要先实例化SearchPvfParam类
    //@param searchPvfParam:type SearchPvfParam
    // queryPvfFile(searchPvfParam) {
    //     return new Promise((res, rej) => {
    //         getPvfConfig.then(result => {
    //             if (!result || !result.value) {
    //                 return rej(UnConfigError)
    //             }

    //             const config = JSON.parse(result.value);

    //             if (config.name == "1") {
    //                 return rej(NoEditError);
    //             }

    //             pvf.pvfUtility.SearchPvf(config.ip, config.value, searchPvfParam).then(data => {
    //                 res(data)
    //             }).catch(e => {
    //                 rej(e)
    //             })

    //         }).catch(e => {
    //             rej(e)
    //         })
    //     });
    // },

    //pvf数值搜索
    //@param keyword:number 关键字
    //@param dirNames:string[] 文件路径
    //@param fileTypes:string 文件后缀名
    // queryPvfFileByNumber(keyword, dirNames, fileTypes) {
    //     const config = getPvfConfig();

    //     if (config.name == "") {
    //         return new Promise((res, rej) => {
    //             rej(UnConfigError);
    //         })
    //     }

    //     if (config.name == "0") {
    //         const searchPvfParam = new SearchPvfParam()
    //         searchPvfParam.type = 0;

    //         return pvf.pvfUtility.searchPvf(config.ip, config.port)
    //     } else {
    //         return new Promise((res, rej) => {
    //             rej(NoEditError);
    //         })
    //     }
    // },


    //pvf字符串搜索
    //@param keyword:string 关键字
    //@param dirNames:string[] 文件路径
    //@param fileTypes:string 文件后缀名
    // queryPvfFileByString(keyword, dirNames, fileTypes) {
    //     const config = getPvfConfig();

    //     if (config.name == "") {
    //         return new Promise((res, rej) => {
    //             rej(UnConfigError);
    //         })
    //     }

    //     if (config.name == "0") {
    //         const searchPvfParam = new SearchPvfParam()
    //         searchPvfParam.type = 1;

    //         return pvf.pvfUtility.searchPvf(config.ip, config.port)
    //     } else {
    //         return new Promise((res, rej) => {
    //             rej(NoEditError);
    //         })
    //     }
    // },

    //pvf文件名搜索
    //@param keyword:string 关键字
    //@param dirNames:string[] 文件路径
    //@param fileTypes:string 文件后缀名
    // queryPvfFileByFilename(keyword, dirNames, fileTypes) {
    //     const config = getPvfConfig();

    //     if (config.name == "") {
    //         return new Promise((res, rej) => {
    //             rej(UnConfigError);
    //         })
    //     }

    //     if (config.name == "0") {
    //         const searchPvfParam = new SearchPvfParam()
    //         searchPvfParam.type = 2;

    //         return pvf.pvfUtility.searchPvf(config.ip, config.port)
    //     } else {
    //         return new Promise((res, rej) => {
    //             rej(NoEditError);
    //         })
    //     }
    // },

    //pvf name搜索
    //@param keyword:string 关键字
    //@param dirNames:string[] 文件路径
    //@param fileTypes:string 文件后缀名
    // queryPvfFileByName(keyword, dirNames, fileTypes) {
    //     const config = getPvfConfig();

    //     if (config.name == "") {
    //         return new Promise((res, rej) => {
    //             rej(UnConfigError);
    //         })
    //     }

    //     if (config.name == "0") {
    //         const searchPvfParam = new SearchPvfParam()
    //         searchPvfParam.type = 3;

    //         return pvf.pvfUtility.searchPvf(config.ip, config.port)
    //     } else {
    //         return new Promise((res, rej) => {
    //             rej(NoEditError);
    //         })
    //     }
    // },

    //pvf 内容搜索
    //@param keyword:string 关键字
    //@param dirNames:string[] 文件路径
    //@param fileTypes:string 文件后缀名
    // queryPvfFileByContent(keyword, dirNames, fileTypes) {
    //     const config = getPvfConfig();

    //     if (config.name == "") {
    //         return new Promise((res, rej) => {
    //             rej(UnConfigError);
    //         })
    //     }

    //     if (config.name == "0") {
    //         const searchPvfParam = new SearchPvfParam()
    //         searchPvfParam.type = 4;

    //         return pvf.pvfUtility.searchPvf(config.ip, config.port)
    //     } else {
    //         return new Promise((res, rej) => {
    //             rej(NoEditError);
    //         })
    //     }
    // }
}

module.exports = {
    Pvf,
    // SearchPvfParam,
    // SEARCH_TYPE
}